package cn.bugstack.chatgpt.data.config;

import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.utils.InnerWordCharUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 敏感词配置
 */
@Slf4j
@Configuration
public class SensitiveWordConfig {

    /**
     * 将这个方法返回的 SensitiveWordBs 对象注册为 Spring 的 Bean，这样在别的类中就可以用 @Resource 或 @Autowired 注入它。
     * SensitiveWordBs的核心方法wordReplace接受一个IWordPlace类型的对象，这是一个只包含一个方法的接口，因此可以不显式实现接口，使用Lambda表达式来完成创建
     * 这里的lambda表达式实现了IWordReplace接口中的replace方法，这四个参数就是该方法的参数。不这样做的话就要显示实现接口，在注入赋值
     *
     * ***只要接口是函数式接口（只有一个抽象方法），你就可以用 Lambda 表达式来“隐式实现”它，而不用写一个显式的实现类***。
     */
    @Bean
    public SensitiveWordBs sensitiveWordBs() {
        return SensitiveWordBs.newInstance()
                // wordReplace方法指定了替换敏感词的逻辑
                .wordReplace((stringBuilder, chars, wordResult, iWordContext) -> {
                    String sensitiveWord = InnerWordCharUtils.getString(chars, wordResult);
                    log.info("检测到敏感词: {}", sensitiveWord);

                    //替换操作，你可以指定的替换为*或者其他
                    int wordLength = wordResult.endIndex() - wordResult.startIndex();
                    for (int i = 0; i < wordLength; i++) {
                        stringBuilder.append("*");
                    }
                    log.info("原内容已被替换为：{}", stringBuilder);

                })
                .ignoreCase(true)
                .ignoreWidth(true)
                .ignoreNumStyle(true)
                .ignoreChineseStyle(true)
                .ignoreEnglishStyle(true)
                .ignoreRepeat(false)
                .enableNumCheck(true)
                .enableEmailCheck(true)
                .enableUrlCheck(true)
                .enableWordCheck(true)
                .numCheckLen(1024)
                .init();
    }

}
